#include <stdio.h>
#include <getch.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "system.h"
#include "struct.h"
#include "tools.h"
#include "teacher.h"

Teacher* tea;
char teacher_menu(void)//目录
{
	system("clear");	
	puts("***欢迎使用教师系统***");
	puts("1、添加学生");
	puts("2、删除学生");
	puts("3、查找学生");
	puts("4、修改学生信息");
	puts("5、录入学生成绩");
	puts("6、重置学生密码");
	puts("7、显示所有在校学生信息");
	puts("8、显示所有退出学生信息");
	puts("9、退出系统");
	puts("************************");
	puts("请输入指令:");
	char ch = getch();
	printf("%c\n",ch);
	return ch;
}
void add_stu(void)//添加学生
{	
	int count=0;
	while(stu[count].sex) count++;//计数，已有的学生数量
	printf("单个添加(1)/批量添加(2)\n");
	char choice = getch();
	if(choice=='1')		//单个添加
	{
		if(MAX <= count)  //如果已有的学生数大于等于MAX，则添加不了
		{
			show_msg("系统正在升级，请稍等...\n",1.5);
			return;
		}
		int i = count;
		char name[20];
		char sex;
		printf("请输入学生姓名:");
		get_str(name);
		printf("请输入性别(m/w):");
		scanf("%c",&sex);
		if('w' == sex || 'm' == sex)//判断输入的字符是否为w或m
		{
			sprintf(stu[i].name,"%s",name);		//赋值名字
			stu[i].sex=sex;						//赋值性别
			sprintf(stu[i].passwd,"%s","0");	//赋值密码初始值
		}
		else
		{
			printf("性别输入错误,请重新输入\n");
			anykey_continue();
			return;
		}

		sprintf(stu[i].id,"%d",i+1);			//自动生成学号
		printf("已自动生成学号:%s\n",stu[i].id);
		show_msg("添加学生成功!\n",0);
		anykey_continue();
	}
	if(choice=='2')		//批量导入
	{
		printf("批量导入，请输入要导入的文件名\n");
		char file[255];
		get_str(file);
		
		FILE* frp1 = fopen(file,"r");//打开文件
		int i=0;
		while(stu[i].sex) i++;	//计数，已有的学生数量
		for(;i<MAX;i++)			//循环输入
		{
			fscanf(frp1,"%s %c\n",stu[i].name,&stu[i].sex);//赋值名字，性别
			sprintf(stu[i].id,"%d",i+1);		//自动生成学号
			sprintf(stu[i].passwd,"%s","0");	//赋值密码初始值
		}
		fclose(frp1);
		show_msg("添加学生成功!\n",0);
		anykey_continue();
	}
	else
	{
		show_msg("回到上一级\n",1.5);
		return;
	}
}
void del_stu(void)//删除学生
{
	char key1[20] = {};
	char key2[20] = {};
	puts("请输入要删除的联系人姓名:");
	get_str(key1);
	puts("请再次输入要删除的联系人姓名:");
	get_str(key2);
	if(0 == strcmp(key1,key2))//如果两次输入的名字相同
	{
		for(int i=0; i<MAX ; i++)
		{
			if(stu[i].exist==0 && 0 == strcmp(key1,stu[i].name))//判断是否在学校并且名字匹配
			{
				stu[i].exist = 1;
				show_msg("删除学生成功!\n",1.5);
				return;
			}
		}

	}
	else
	{
		puts("两次输入名字不一致");
		anykey_continue();
		return;
	}

	show_msg("查无此人,请检查\n",1.5);
}

void find_stu(void)//查找学生
{
	char key[20] = {};
	puts("请输入要查询的学生名或学号:");
	get_str(key);

	for(int i=0; i<MAX; i++)
	{
		if(stu[i].exist==0)//判断是否退学
		{
			if(strstr(stu[i].name,key) || strstr(stu[i].id,key))	//判断输入学生名或学号是否匹配
			{
				printf("姓名：%s 性别：%s 学号：%s 语文：%.1f 英语：%.1f 数学：%.1f\n",stu[i].name,
				'w' == stu[i].sex?"女":"男",stu[i].id,stu[i].chinese,stu[i].english,stu[i].math);	
			}
		}
	}
	anykey_continue();
}
void modify_stu(void)//修改学生信息
{
	char key[20] = {};
	puts("请输入要修改的学生名或学号:");
	get_str(key);
	
	for(int i=0; i<MAX; i++)
	{
		if(stu[i].exist==0)//判断是否退学
		{
			if(0==strcmp(stu[i].name,key) || 0==strcmp(stu[i].id,key))	//判断输入学生名或学号是否匹配
			{
				puts("请输入要修改信息:\n1.姓名 2.性别 3.学号 \n4.语文成绩 5.英语成绩 6.数学成绩\n7.返回");
				stdin->_IO_read_ptr = stdin->_IO_read_end;//清理缓存区
				char choice = getch();
				if(choice=='1')
				{	
					puts("姓名修改为：");
					scanf("%s",stu[i].name);
					show_msg("修改成功!\n",1.5);
					return;
				}
				if(choice=='2')
				{	
					char sex;
					puts("性别修改为：");
					scanf("%c",&sex);
					if('w' == sex || 'm' == sex)
					{
						stu[i].sex=sex;
					}
					else
					{
						printf("性别输入错误,请重新输入\n");
						anykey_continue();
						return;
					}
					show_msg("修改成功!\n",1.5);
					return;
				}
				if(choice=='3')
				{	
					puts("学号修改为：");
					scanf("%s",stu[i].id);
					show_msg("修改成功!\n",1.5);
					return;
				}
				if(choice=='4')
				{	
					puts("语文成绩修改为：");
					scanf("%f",&stu[i].chinese);
					show_msg("修改成功!\n",1.5);
					return;
				}
				if(choice=='5')
				{	
					puts("英语成绩修改为：");
					scanf("%f",&stu[i].english);
					show_msg("修改成功!\n",1.5);
					return;
				}
				if(choice=='6')
				{	
					puts("数学成绩修改为：");
					scanf("%f",&stu[i].math);
					show_msg("修改成功!\n",1.5);
					return;
				}
				else
				{	
					return;
					
				}
				
			}
		}
	}
	puts("未找到该学生");
	anykey_continue();
}
void add_score(void)//添加成绩
{
	printf("单个录入成绩(1)/批量录入成绩(2)\n");
	char choice = getch();
	if(choice=='1')//单个录入
	{
		char name[20];
		printf("请输入学生姓名:");
		get_str(name);

		for(int i=0;i<MAX;i++)
		{
			if(strcmp(name,stu[i].name)==0)//查找学生名字的匹配项
			{
				puts("请输入语文、英语、数学成绩");
				scanf("%f %f %f",&stu[i].chinese,&stu[i].english,&stu[i].math);//添加成绩
				puts("成绩添加成功");
				anykey_continue();
				return;
			}
		}
		puts("未找到该学生");
		anykey_continue();
	}
	if(choice=='2')//批量录入
	{
		printf("批量导入成绩，请输入要导入的文件名\n");
		char file[255];
		scanf("%s",file);
		FILE* frp1 = fopen(file,"r");//打开文件
		char name[20]={};
		float a,b,c;
		for(int j=0;j<MAX;j++)
		{
			fscanf(frp1,"%s %f %f %f\n",name,&a,&b,&c);//文件导入成绩到a，b，c中
			for(int i=0;i<MAX;i++)
			{		
				if(strcmp(name,stu[i].name)==0)//查找学生名字的匹配项
				{	
					stu[i].chinese=a;	
					stu[i].english=b;
					stu[i].math=c;		//将成绩输入到结构体中
				}
			}
			
		}
		fclose(frp1);
		show_msg("添加学生成绩成功!\n",0);
		anykey_continue();
	}
	else
	{
		show_msg("回到上一级\n",1.5);
		return;
	}
}
void reset_stu(void)//重置学生密码
{
	puts("请输入要重置密码的学生学号");
	char num[20]={};
	char pw[20]="123";
	get_str(num);
	for(int i=0; i<MAX; i++)
	{
		if(0==strcmp(stu[i].id,num))//判断输入的学生学号与已存在的学号有无匹配
		{
			stu[i].cnt=0;
			stu[i].exist=0;
			strcpy(stu[i].passwd,pw);
			puts("已重置密码为123");
			anykey_continue();
			return;
		}
	}
	puts("未找到该学生");
	anykey_continue();
}
void show_live_stu(void)//显示在校学生
{
	puts("显示在校学生");
	for(int i=0; i<MAX; i++)
	{
		if(stu[i].sex && stu[i].exist==0)
		{
			printf("姓名：%s 性别：%s 学号：%s 语文：%.1f 英语：%.1f 数学：%.1f\n",stu[i].name,
			'w' == stu[i].sex?"女":"男",stu[i].id,stu[i].chinese,stu[i].english,stu[i].math);
		}
	}
	anykey_continue();
}
void show_leave_stu(void)//显示退学学生
{
	puts("显示退学学生");
	for(int i=0; i<MAX; i++)
	{
		if(stu[i].sex && stu[i].exist==1)
		{
			printf("姓名：%s 性别：%s 学号：%s 语文：%.1f 英语：%.1f 数学：%.1f\n",stu[i].name,
			'w' == stu[i].sex?"女":"男",stu[i].id,stu[i].chinese,stu[i].english,stu[i].math);
		}
	}
	anykey_continue();
}

bool login_tea(void)//登录
{
	char id[20]={};
	char password[20]={};
	puts("请输入用户名");
	get_str(id);
	puts("请输入密码");
	
	get_str(password);

	for(int i=0; i<MAX; i++)
	{
		if(strcmp(id,tea[i].id)==0)//判断输入的用户名是否存在
		{	
			
			if(0 == strcmp(tea[i].passwd,"0"))//比较是否是第一次登录
			{	
				puts("第一次登录，请输入密码");
				scanf("%s",tea[i].passwd);
				return false;
			}
			if(tea[i].cnt==3)//判断密码是否错误三次
			{
				puts("此用户已被锁定\n");
				anykey_continue();
				return false;
			}
			if(tea[i].exist==1)//判断是否离职
			{
				puts("此教师已离职\n");
				anykey_continue();
				return false;
			}
			if(strcmp(password,tea[i].passwd)==0)//判断密码是否正确
			{
				tea[i].cnt=0;
				return true;
			}
			else
			{	
				tea[i].cnt=tea[i].cnt+1;		//密码错误，cnt+1
				puts("密码错误\n");
				anykey_continue();
				return false;
			}
		}
	}
	puts("用户名不存在\n");
	anykey_continue();
	return false;

}

void teacher(void)//老师系统入口
{	
	if(login_tea())//登录
	{
		for(;;)
		{	
			switch(teacher_menu())
			{
				case '1':	add_stu(); 			break;
				case '2':	del_stu(); 			break;
				case '3':	find_stu();			break;
				case '4':	modify_stu();		break;
				case '5':	add_score();		break;
				case '6':	reset_stu();		break;
				case '7':	show_live_stu();	break;
				case '8':	show_leave_stu();	break;
				case '9':	return;
			}
		

		}
	}

}
